package com.ysq.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ysq.common.BaseContext;
import com.ysq.entity.ShoppingCart;
import com.ysq.mapper.ShoppingCartMapper;
import com.ysq.service.ShoppingCartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * ClassName: ShoppingCartServiceImpl
 * Package: com.ysq.service.impl
 * Description:
 *
 * @Author YSQ
 * @Create 2023/1/12 10:14
 */
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
    @Autowired
    private ShoppingCartMapper mapper;

    @Override
    public boolean add(ShoppingCart shoppingCart) {
        int row = 0;
        //设置shoppingCart的userId属性, 以此表明当前是哪个用户的购物车数据
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);

        //查询当前菜品/套餐是否已经在购物车里面
        //怎么判断是菜品还是套餐? 如果加入的是菜品就有dishId, 如果加入的是套餐就有setmealId
        //怎么查询? 根据当前用户ID查询shopping_cart表
        //最终执行的SQL语句为: select * from shopping_cart where user_id = ? and dish_id/setmealid = ?;
        //1. 创建条件构造器
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        //2. 插入条件
        //2.1 第一个条件:user_id的判断
        lqw.eq(ShoppingCart::getUserId, currentId);//where user_id = ?
        //2.2 第二个条件:dish_id 或 setmeal_id
        if (shoppingCart.getDishId() != null) {
            //这代表添加到购物车的是菜品
            lqw.eq(ShoppingCart::getDishId, shoppingCart.getDishId());//where dish_id = ?
        } else {
            //这代表添加到购物车的是套餐
            lqw.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());//where setmeal_id = ?
        }
        //3. 执行查询
        ShoppingCart selectOne = mapper.selectOne(lqw);

        //判断当前查询的商品是否存在
        if (selectOne != null) {
            //如果已经存在, 就在当前的基础上数量+1, 就是把shoppingCart的number属性+1, 然后更新shopping_cart表
            //1. 此时代表添加的商品已存在, 那么数量+1
            selectOne.setNumber(selectOne.getNumber() + 1);
            //2. 更新shopping_cart表
            row += mapper.updateById(selectOne);
        } else {
            //如果不存在, 就设置shoppingCart的number属性为1, 更新shopping_cart表
            //1. 此时代表添加的商品不存在, 那么设置数量为1
            shoppingCart.setNumber(1);
            //2. 更新shopping_cart表
            row += mapper.insert(shoppingCart);
        }
        return row > 0;
    }

    @Override
    public List<ShoppingCart> list() {
        //先获取当前用户ID 这是查询条件
        Long currentId = BaseContext.getCurrentId();
        //创建条件构造器
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        //插入条件
        lqw.eq(ShoppingCart::getUserId, currentId);//where user_id = ?
        //执行查询
        List<ShoppingCart> shoppingCarts = mapper.selectList(lqw);
        //将查询结果返回
        return shoppingCarts;
    }

    @Override
    public boolean sub(ShoppingCart shoppingCart) {
        //整体逻辑上是和添加操作相反的, 额外要补充的就是当number=0时就从shopping_cart表中删除这个商品对应的数据
        int row = 0;
        //设置shoppingCart的userId属性, 以此表明当前是哪个用户的购物车数据
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);

        //查询当前商品在shopping_cart表中的具体信息
        //最终执行的SQL语句为: select * from shopping_cart where user_id = ? and dish_id/setmealid = ?;
        //1. 创建条件构造器
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        //2. 插入条件
        //2.1 第一个条件:user_id的判断
        lqw.eq(ShoppingCart::getUserId, currentId);//where user_id = ?
        //2.2 第二个条件:dish_id 或 setmeal_id
        if (shoppingCart.getDishId() != null) {
            //这代表是菜品
            lqw.eq(ShoppingCart::getDishId, shoppingCart.getDishId());//where dish_id = ?
        } else {
            //这代表是套餐
            lqw.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());//where setmeal_id = ?
        }
        //3. 执行查询
        ShoppingCart selectOne = mapper.selectOne(lqw);

        //查看selectOne的number属性
        if (selectOne.getNumber() > 1) {
            //此时点了 - 号, 那么要做的就是让其number--
            selectOne.setNumber(selectOne.getNumber() - 1);
            //然后更新shopping_cart表
            row += mapper.updateById(selectOne);
        } else {
            //此时代表这个商品就点了1个, 如果此时点 - 号, 那么就要从shopping_cart表中删除这个商品数据
            row += mapper.deleteById(selectOne);
        }
        return row > 0;
    }

    @Override
    public boolean clean() {
        //拿到当前用户ID
        Long currentId = BaseContext.getCurrentId();
        //创建条件构造器
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        //插入条件
        lqw.eq(ShoppingCart::getUserId, currentId);//where user_id = ?
        //执行删除
        int row = mapper.delete(lqw);
        return row > 0;
    }


}
